Lexicographical numbers

Time: O(N); Space: O(1); medium

Given an integer n, return 1 - n in lexicographical order.

Example 1:

Input: n = 13

Output: [1,10,11,12,13,2,3,4,5,6,7,8,9].

Notes:

  • Please optimize your algorithm to use less time and space.

  • The input size may be as large as 5,000,000.

[1]:
class Solution1(object):
    def lexicalOrder(self, n):
        result = []

        i = 1
        while len(result) < n:
            k = 0
            while i * 10**k <= n:
                result.append(i * 10**k)
                k += 1

            num = result[-1] + 1
            while num <= n and num % 10:
                result.append(num)
                num += 1

            if not num % 10:
                num -= 1
            else:
                num //= 10

            while num % 10 == 9:
                num //= 10

            i = num + 1

        return result
[2]:
s = Solution1()
n = 13
assert s.lexicalOrder(n) == [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]